#include <rclcpp/rclcpp.hpp>
#include <std_msgs/msg/int32.hpp>
//导入发布消息所需要的数据类型
#include <chrono> 
// 这里导入了一个与时间相关头文件


using namespace std::chrono_literals;
//使用字面量，相当于可以在代码里使用s和ms来表示时间

class Count_Publisher_Subscriber : public rclcpp::Node//继承自ros2官方的cpp库
{
public:

    rclcpp::Publisher<std_msgs::msg::Int32>::SharedPtr publisher_;
    rclcpp::Subscription<std_msgs::msg::Int32>::SharedPtr subscriber_;
    //创建发布者与接收者的智能指针
    rclcpp::TimerBase::SharedPtr timer_;//定时器的智能指针
    int count_;//用来记录每一次发布的数据

    Count_Publisher_Subscriber() : Node("count_publisher_subscriber")
    {
        //用继承自父类的函数创建一个发布者，发布消息到"nums"话题
        publisher_ = this->create_publisher<std_msgs::msg::Int32>("nums", 10);

        //用继承自父类的函数创建一个订阅者，接收来自"nums"话题的信息
        subscriber_ = this->create_subscription<std_msgs::msg::Int32>(
            "nums", 10, std::bind(&Count_Publisher_Subscriber::sub_callback, this, std::placeholders::_1));
            //创建一个接收者，并将自己的成员函数用作回调函数
            //因为是成员函数，使用要用bind绑定该函数与对象
        
        timer_ = this->create_wall_timer(
            1000ms, std::bind(&Count_Publisher_Subscriber::timer_callback, this));
            //创建一个定时器，并将自己的成员函数用作回调函数
            //因为是成员函数，使用要用bind绑定该函数与对象

        count_ = 0;
    }

private:
    void timer_callback()
    {
        auto msg = std_msgs::msg::Int32();//实例化一个该类型的变量
        msg.data = count_++;
        publisher_->publish(msg);//发布消息
    }

    void sub_callback(const std_msgs::msg::Int32::SharedPtr msg)
    {
        RCLCPP_INFO(this->get_logger(), "data is : '%d'", msg->data);
        //使用rclcpp库的宏输出接收到的数据
    }


};

int main(int argc, char * argv[])
{
    rclcpp::init(argc, argv);
    auto node = std::make_shared<Count_Publisher_Subscriber>();
    rclcpp::spin(node);
    rclcpp::shutdown();
    return 0;
}